// 声明一个类. 声明类之后会产生一个类型
class Computer {
  //属性
  brand: string;
  color: string;
  name: string = "电脑";

  //方法
  constructor(brand: string, color: string) {
    this.brand = brand;
    this.color = color;
  }

  //声明方法
  playGame() {
    console.log("可以玩游戏~~");
  }
}

class LapTop extends Computer {
  size: string;
  weight: string;

  constructor(brand: string, color: string, size: string, weight: string) {
    //调用 super
    super(brand, color);
    this.size = size;
    this.weight = weight;
  }
}

//实例化  声明了一个 Computer 类型的变量, 变量的值为一个对象
// let lx:Computer = new Computer('联想', '灰色');
// let lx = new Computer('联想', '灰色');

//实例化子类
let hp: LapTop = new LapTop("惠普", "白色", "15.6", "2.5kg");
console.log(hp);

{
  //
  class A {
    //公共的   在任意位置都可以访问
    public pa: string = "aaa";
    //受保护的  能在本类和子类中访问, 类的外部无法访问
    protected pb: string = "bbb";
    //私有的. 只能在当前本类中, 子类和类的外部都无法访问
    private pc: string = "ccc";

    getProp(){
      console.log(this.pa);
      console.log(this.pb);
      console.log(this.pc);
    }
  }

  class B extends A{
    getProp(){
      //访问 pa pb pc
      console.log(this.pa);// OK
      console.log(this.pb);// OK
      // console.log(this.pc);// NG
    }
  }

  let a = new A();
  // console.log(a.pa);
  // console.log(a.pb);// 属性“pb”受保护，只能在类“A”及其子类中访问
  // console.log(a.pc);// 属性“pc”为私有属性，只能在类“A”中访问
  // a.getProp();

  //实例化 B
  let b = new B();
  console.log(b);
  
}
